package br.com.tcc.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.ToggleEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import br.com.tcc.dao.CategoriaDAO;
import br.com.tcc.model.Categoria;
import br.com.tcc.util.Utils;

@ManagedBean (name = "categoriaBean")
@SessionScoped
public class CategoriaBean {
	
	private CategoriaDAO cDAO = new CategoriaDAO();
	
	private Categoria categoria;
	
	private boolean master;
	
	private List<Categoria> listCategorias;
	
	private List<SelectItem> listaTodasCategorias;
	
	private TreeNode treeCategorias; 
	
	public String addCategoria() {
		categoria = new Categoria();
		master = false;
		treeCategorias = null;
		listaTodasCategorias = null;
		return "addCategoria";
	}
	
	public String tebelaCategorias() {
		return "tabelaCategorias";
	}
	
	public String  adicionar() {
		boolean retorno = true;
		Categoria catePai = cDAO.buscarId(categoria.getCategoriaPai());
		if (categoria.getIdCategoria() == 0) {
			categoria.setNivelCategoria(0);
			
			if (!master) 
				categoria.setNivelCategoria(catePai.getNivelCategoria()+1);
			
		}else {
			Categoria aux = cDAO.buscarId(categoria.getIdCategoria());
			aux.setNome(categoria.getNome());
			categoria = aux;
		}
		
		retorno = cDAO.adicionar(categoria);
		
		if (retorno) {
			treeCategorias = null;
			listaTodasCategorias = null;
			listCategorias = cDAO.buscarCategorias();
			return "tabelaCategorias";
		} else {
			Utils.addMessageErro("Sistema temporariamente indisponivel, tente novamente mais tarde");
			return "addCategoria";
		}
	}
	
	public String editarCategoria() {
		if (categoria.getNivelCategoria() == 0) 
			master = true;
		
		return  "addCategoria";
	}
	
	/**
	 * Buscar todas as categorias para criar o menu de categorias
	 * @return
	 */
	public List<Categoria> getListCategorias() {
		if (listCategorias == null) {
			listCategorias = cDAO.buscarCategorias();
		}
		return listCategorias;
	}

	public void setListCategorias(List<Categoria> listCategorias) {
		this.listCategorias = listCategorias;
	}

	public Categoria getCategoria() {
		if (categoria == null) {
			categoria = new Categoria();
		}
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public boolean isMaster() {
		return master;
	}

	public void setMaster(boolean master) {
		this.master = master;
	}

	/**
	 * Consultar todas as categorias cadastradas no site
	 * @return
	 */
	
	public List<SelectItem> getListaTodasCategorias() {
		if (listaTodasCategorias == null) {
			listaTodasCategorias = new ArrayList<SelectItem>();
			
			List<Categoria> cat = cDAO.listarCategorias();
			for (int i = 0; i < cat.size(); i++) {
				Categoria c = cat.get(i);
				listaTodasCategorias.add(new SelectItem(c.getIdCategoria(), c.getNome()));
			}
		}
		return listaTodasCategorias;
	}
	
	public void setListaTodasCategorias(List<SelectItem> listaTodasCategorias) {
		this.listaTodasCategorias = listaTodasCategorias;
	}
	
	
	public void onRowToggle(ToggleEvent event) {  
		
	}

	public TreeNode getTreeCategorias() {
		if (treeCategorias == null) {
			treeCategorias = new DefaultTreeNode("treeCategorias", null);
			
			for (int i = 0; i < listCategorias.size(); i++) {
				Categoria cat0 = listCategorias.get(i);
				TreeNode treeNodeCat0 = new DefaultTreeNode(new Categoria(cat0.getNome(), cat0.getIdCategoria(), cat0.getCategoriaPai()), treeCategorias); 
				
				List<Categoria> lAux0  = cat0.getCategoriasFilhas();
				for (int j = 0; j < lAux0.size(); j++) {
					Categoria cat1 = lAux0.get(j);
					TreeNode treeNodeCat1 = new DefaultTreeNode(new Categoria(cat1.getNome(), cat1.getIdCategoria(), cat1.getCategoriaPai()), treeNodeCat0); 
					
					List<Categoria> lAux1  = cat1.getCategoriasFilhas();
					for (int k = 0; k < lAux1.size(); k++) {
						Categoria cat2 = lAux1.get(k);
						TreeNode treeNodeCat2 = new DefaultTreeNode(new Categoria(cat2.getNome(), cat2.getIdCategoria(), cat2.getCategoriaPai()), treeNodeCat1); 
						
						List<Categoria> lAux2  = cat2.getCategoriasFilhas();
						for (int l = 0; l < lAux2.size(); l++) {
							Categoria cat3 = lAux2.get(l);
							TreeNode treeNodeCat3 = new DefaultTreeNode(new Categoria(cat3.getNome(), cat3.getIdCategoria(), cat3.getCategoriaPai()), treeNodeCat2); 
						}
					}
				}
			}
		}
		return treeCategorias;
	}

	public void collapsingORexpanding(TreeNode n, boolean option) {

		if (n.getChildren().size() == 0) {
			n.setSelected(false);
		} else {
			for (TreeNode s : n.getChildren()) {
				collapsingORexpanding(s, option);
			}
			n.setExpanded(option);
			n.setSelected(false);
		}
	}

	public void setTreeCategorias(TreeNode treeCategorias) {
		this.treeCategorias = treeCategorias;
	}
	
}
